 REM > <Audio$Dir>.!RunImage
 REM (C) Rob Craig-Wood

 SYS "Wimp_Initialise",200,&4B534154,"Audio" TO ,task%
 ON ERROR PROCclose:REPORT:PRINT" at line ";ERL:END
 OSCLI("Set Audio$Loaded Yes")
 PROCinit
 ON ERROR IF FNerror THEN PROCclose:END
 REPEAT
 PROCpoll
 UNTIL quit%
 PROCclose
 END
:
 DEF PROCclose
 REM shuts down application
 OSCLI("Set Audio$Loaded No")
 SYS "Wimp_CloseDown",task%,&4B534154
 ENDPROC
:
 DEF PROCpoll
 REM main Wimp polling routine
 SYS "Wimp_Poll",,b% TO r%
 CASE r% OF
 WHEN 1 : PROCredraw
 WHEN 2 : SYS "Wimp_OpenWindow",,b%
 WHEN 3 : SYS "Wimp_CloseWindow",,b% : PROCclose
 WHEN 6 : PROCmouseclick
 WHEN 17,18 : PROCreceive
 ENDCASE
 ENDPROC
:
 DEF FNerror
 REM main error handling routine
 !b%=ERR
 CASE !b% OF
 WHEN 1<<30:err_str$="":box%=3
 WHEN (1<<30)+1:err_str$="":box%=1
 WHEN (1<<30)+2:err_str$="":box%=2
 OTHERWISE:err_str$=" at line "+STR$ ERL:box%=2
 ENDCASE
 $(b%+4)=REPORT$+err_str$+CHR$0
 SYS "Wimp_ReportError",b%,box%,"shell" TO ,response%
 =(response%=2)
:
 DEF PROCreceive
 REM handles Wimp messages
 CASE b%!16 OF
 WHEN 0:quit%=TRUE
 ENDCASE
 ENDPROC
:
 DEF PROCinit
 REM main initialisation routine
 DIM b% 700,ws% 700
 wsend%=ws%+700
 quit%=FALSE
 oldvol%=0
 PROCload_templates
 LOCAL c%
 c%=b%+500
 SYS "Sound_Speaker",0 TO c%
 IF c%=2 speakon%=TRUE : PROCset_icon_state(audio%,1,1)
 IF c%=1 speakon%=FALSE : PROCset_icon_state(audio%,1,0)
 SYS "Sound_Volume",0 TO c%
 soundvol%=c%
 PROCset_icon_string(audio%,6,STR$(soundvol%))
 PROCset_icon_length(audio%,4,(soundvol%*2),2)
 SYS "Sound_Stereo",1,128 TO ,c%
 stereopos%=c%
 PROCset_icon_xpos(audio%,13,(stereopos%+248),11)
 PROCopen_window(audio%)
 ENDPROC
:
 DEF PROCmouseclick
 REM called when mouse button pressed or clicked
 REM b%!0=mousex,b%!4=mousey:b%!8=buttons:b%!12=window handle (-2 for icon bar):b%!16=icon han dle
 CASE b%!16 OF
  WHEN 9 : VDU 7
  WHEN 5 : PROCaudio_volbar_click
  WHEN 1 : PROCaudio_speaker
  WHEN 7 : PROCaudio_volchange(-1)
  WHEN 8 : PROCaudio_volchange(1)
 ENDCASE
 ENDPROC
:
 DEF PROCload_templates
 SYS "Wimp_OpenTemplate",,"<Audio$Dir>.Templates"
 SYS "Wimp_LoadTemplate",,b%,ws%,wsend%,-1,"Audio",0 TO ,,ws%
 SYS "Wimp_CreateWindow",,b% TO audio%
 SYS "Wimp_CloseTemplate"
 ENDPROC
:
 DEF PROCredraw
 REM redraws window contents
 SYS "Wimp_RedrawWindow",,b% TO more%
 WHILE more%
 REM PROCdraw(!b%)
 SYS "Wimp_GetRectangle",,b% TO more%
 ENDWHILE
 ENDPROC
:
 DEF PROCget_origin(handle%,RETURN xorig%,RETURN yorig%)
 REM returns coordinates of window work area origin
 LOCAL c%
 c%=b%+500
 !c%=handle%
 SYS "Wimp_GetWindowState",,c%
 xorig%=c%!4-c%!20:yorig%=c%!16-c%!24
 ENDPROC
:
 DEF PROCterm(a%)
 REM puts Return character (ASCII 13) on end of string at a%
 LOCAL n%
 WHILE a%?n%>31
 n%+=1
 ENDWHILE
 a%?n%=13
 ENDPROC
:
 DEF FNicon_state(window%,icon%)
 REM returns TRUE if icon is selected, FALSE if not.
 LOCAL c%
 c%=b%+500
 !c%=window%
 c%!4=icon%
 SYS "Wimp_GetIconState",,c%
 =((c%!24) AND (1<<21))<>0
:
 DEF PROCset_icon_state(window%,icon%,tf%)
 b%!0=window%
 b%!4=icon%
 b%!8=tf%<<21
 b%!12=1<<21
 SYS "Wimp_SetIconState",,b%
 ENDPROC
:
 DEF PROCopen_window(win%)
 b%!0=win%
 SYS "Wimp_GetWindowState",,b%
 SYS "Wimp_OpenWindow",,b%
 ENDPROC
:
 DEF PROCforce_redraw(window%)
 REM redraws visible portion of window
 LOCAL c%
 c%=b%+500
 !c%=window%
 SYS "Wimp_GetWindowState",,c%
 SYS "Wimp_ForceRedraw",-1,c%!4,c%!8,c%!12,c%!16
 ENDPROC
:
 DEF FNstring_addr(window%,icon%)
 REM returns address of icon's indirected text string
 LOCAL c%
 c%=b%+500
 !c%=window%
 c%!4=icon%
 SYS "Wimp_GetIconState",,c%
 =c%!28
:
 DEF FNicon_string(window%,icon%)
 REM returns icon's indirected text string
 PROCterm(FNstring_addr(window%,icon%))
 =$FNstring_addr(window%,icon%)
:
 DEF PROCset_icon_string(window%,icon%,a$)
 REM sets icon's indirected text string
 $FNstring_addr(window%,icon%)=a$
 ENDPROC
:
 DEF PROCforce_redraw_icon(window%,icon%)
 b%!00=window%
 b%!04=icon%
 b%!08=0
 b%!12=0
 SYS "Wimp_SetIconState",,b% TO more%
 ENDPROC
:
 DEF PROCaudio_volbar_click
 PROCget_origin(audio%,xorig%,yorig%)
 mousex%=b%!0-xorig%-28
 IF mousex%>254 mousex%=254
 IF mousex%<2 mousex%=2
 IF mousex%=oldvol% THEN ENDPROC ELSE oldvol%=mousex%
 PROCset_icon_length(audio%,4,mousex%,2)
 soundvol%=mousex%/2
 PROCset_icon_string(audio%,6,STR$(soundvol%))
 PROCforce_redraw_icon(audio%,6)
 SYS "Sound_Volume",soundvol%
 ENDPROC
:
 DEF PROCset_icon_length(window%,icon%,length%,base%)
 LOCAL c%
 c%=b%+500
 !b%=window% : b%!4=icon%
 SYS "Wimp_GetIconState",,b%
 b%!16=b%!8+length%
 !c%=window%
 c%!4=icon%
 SYS "Wimp_DeleteIcon",,c%
 FOR n=0 TO 31 STEP 4
  c%!(n+4)=b%!(n+8)
 NEXT n
 !c%=window%
 SYS "Wimp_CreateIcon",,c% TO ic%
 !b%=window%
 b%!4=icon%
 SYS "Wimp_GetIconState",,b%
 PROCforce_redraw_icon(window%,base%)
 ENDPROC
:
 DEF PROCaudio_speaker
 IF speakon%=TRUE THEN
  SYS "Sound_Speaker",1
  speakon%=FALSE
 ELSE
  SYS "Sound_Speaker",2
  speakon%=TRUE
 ENDIF
 ENDPROC
:
 DEF PROCaudio_volchange(n%)
 soundvol%=soundvol%+n%
 IF soundvol%>127 soundvol%=127
 IF soundvol%<1 soundvol%=1
 PROCset_icon_string(audio%,6,STR$(soundvol%))
 PROCforce_redraw_icon(audio%,6)
 PROCset_icon_length(audio%,4,(2*soundvol%),2)
 SYS "Sound_Volume",soundvol%
 ENDPROC
:
 DEF PROCset_icon_xpos(window%,icon%,xpos%,base%)
 LOCAL c%
 c%=b%+500
 !b%=window% : b%!4=icon%
 SYS "Wimp_GetIconState",,b%
 b%!8=xpos%
 b%!16=xpos%+24
 !c%=window%
 c%!4=icon%
 SYS "Wimp_DeleteIcon",,c%
 FOR n=0 TO 31 STEP 4
  c%!(n+4)=b%!(n+8)
 NEXT n
 !c%=window%
 SYS "Wimp_CreateIcon",,c% TO ic%
 PROCforce_redraw_icon(window%,base%)
 ENDPROC
:
